// class Octopus {

//     constructor(readonly name: string = "") {
     
//     }

// }

// let a : Octopus = new Octopus("10");
// console.log(a.name);


// class User {
//     // 类实例上
//     private _name!: string;

//     static a: string = "233";

//     static getA(): string {
//         return User.a;
//     }

 
    
//     public get name(): string {
//         return this._name;
//     }
//     public set name(value: string) {

//         this._name = value;
//     }

//     constructor(name: string) {
//         this._name = name;
//     }
// }

// let a = new User("你好")
// a.name = "111"
// User.getA()
// User.a
// console.log(a.name);

abstract class User {
    abstract getName(): void;
    test2() {
        console.log("你好");
    }
}


// class My extends User {

//     constructor() {
//         super()
//     }
    
//     getName(): void {
//         throw new Error("Method not implemented.");
//     }

//     test () {
//         console.log("111");
        
//     }
// }

// let c = new My()
// c.test2()


// function buildName(firstName: string, ...restOfName: string[]) {
//     return firstName + " " + restOfName.join(" ");
//   }
  
//  let employeeName = buildName("Joseph", "Samuel", "Lucas", "MacKinzie");

//  console.log(employeeName);
 
// let deck = {
//     suits: ["hearts", "spades", "clubs", "diamonds"],
//     cards: Array(52),
//     createCardPicker: function() {
//         return () => {
//             let pickedCard = Math.floor(Math.random() * 52);
//             let pickedSuit = Math.floor(pickedCard / 13);

//             console.log(this);
            
//             return {suit: this.suits[pickedSuit], card: pickedCard % 13};
//         }
//     }
// }

// let cardPicker = deck.createCardPicker();

// cardPicker()


// interface UIElement {
//     addClickListener(onclick: (this: void, e: Event) => void): void;
// }


// function identity<T>(arg: T[]): number {
//     return arg.length;
// }

// identity<string>(["1","1111"])

// function identity<T>(arg: T): T {
//     return arg;
// }

// let a: <T>(arg: T) => T  = identity

// interface ddff {
//     <T>(arg: T): T
// }

// function identity<T>(arg: T): T {
//     return arg;
// }

// let myIdentity: ddff = identity;



// interface GenericIdentityFn<T> {
//     (arg: T): T;
// }


// function identity<T>(arg: T): T {
//     return arg;
// }

// let myIdentity: GenericIdentityFn<number> = identity;



// function create<T>(c: new() => T): T {
//     return new c();
// }


// class eee{}

// let c = create<eee>(eee)
// interface Bird {
//     fly(): void;
//     layEggs(): void;
// }

// interface Fish {
//     swim(): void;
//     layEggs(): void;
// }

// function isFish(pet: Fish | Bird): pet is Bird {
//     return (<Bird>pet).layEggs !== undefined;
// }

function isNumber(x: any): x is number {
    console.log("x: ", x);
    console.log("typeof x: ", typeof x);
    
    return typeof x === "number";
}

console.log(isNumber("1"));
